package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 【高级流】对象流---传输对象--实现序列化接口Serializable
 *                 版本号:一定要写,对象写出,读入必须统一版本号
 *
 * ObjectOutputStream  对象输出流  写出---Person.java
 * ObjectInputStream   对象输入流  读入---Person.java
 */
public class ObjectIO {
    /**
     * 需求：将Person.java文件 变成对象 写出--序列化
     * ObjectOutputStream  对象输出流/序列化
     * 序列化--对象转换为二进制
     *
     */

    @Test
    public void testOOS() throws IOException {
        //传输对象：创建对象
        Person p=new Person();
        p.setNames("韩美娟");
        p.setSay(new String[]{"白银必有果，你的报应就是我"});
        //System.out.println(p.toString(p));
        //创建低级流---写出 对象格式：person.obj
        FileOutputStream fos=
           new FileOutputStream("person.obj");
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj)---写出对象
         *作用：将给定对象按照其结构进行转换，转换为一组字节，
         *再通过处理的流写出，写出格式：xxx.obj
         * 抛出异常：NotSerializableException 没有实现实例化接口
         * 原因：传输对象上没有实现Serializable序列化接口
         *
         * Person 类 去掉实例化接口Serializable
         *
         * 对象文件写出操作需要经过两个步骤：（专业术语）
         * 1.通过对象输出流将Person类，转换为一组“组”字节
         * 这个过程叫对象的序列化
         * 2.将序列化后的魅族的字节数据在通过字节流（低级流）
         * 写出到项目中
         */
        oos.writeObject(p);
        System.out.println("写出成功");
    }

    /**
     * ObjectInputStream   对象输入流/反序列化
     *反序列化--二进制转换为对象
     *
     * InvalidClassException 反序列化出现异常：版本号不匹配
     *
     * ClassNotFoundException   没有这个类型异常
     *     产生原因：读入对象不正确，永久保存数据，类型读入不对
     *     person1.class person.obj
     *     person2.class
     *      172.20.11.33
     */
    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
    //创建输入流--peron.obj--读入
       FileInputStream fis=new FileInputStream("person.obj");
    //创建高级流--对象输入流
    ObjectInputStream ois=new ObjectInputStream(fis);
    //readObject() 返回读取的对象，反序列操作
        System.out.println(ois.readObject());
    }

    @Test
    public void testWWO() throws IOException {
        Person p=new Person();
        p.setNames("非");
        p.setSay(new String[]{"无敌"});
        FileOutputStream fos=
                new FileOutputStream("boos.obj");
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        oos.writeObject(p);
        System.out.println("写出成功");
}
    @Test
    public void testISO() throws IOException, ClassNotFoundException {
        FileInputStream fis=new FileInputStream("boos.obj");
        ObjectInputStream ois=new ObjectInputStream(fis);
        System.out.println(ois.readObject());
    }
}
